<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  
  <meta name="generator" content="Hugo 0.98.0" />

  
  <meta name="description" content="走在通往幸福的路上">
  

  
  <link rel="apple-touch-icon" sizes="180x180" href="https://blog.v5u.win/apple-touch-icon.png">

  
  <link rel="icon" type="image/png" sizes="32x32" href="https://blog.v5u.win/favicon-32x32.png">

  
  <link rel="icon" type="image/png" sizes="16x16" href="https://blog.v5u.win/favicon-16x16.png">

  
  <link rel="manifest" href="https://blog.v5u.win/site.webmanifest">

  
  <link rel="mask-icon" href="https://blog.v5u.win/safari-pinned-tab.svg" color="">

  <meta name="msapplication-TileColor" content="">

  <meta name="theme-color" content="">

  
  <link rel="stylesheet" href="https://blog.v5u.win/css/bootstrap.min.css" />

  
  <title>Go modules | 为吾优</title>
  

  <style>
body {
  min-width: 300px;
}

.custom-navbar {
  margin-bottom: 1em;
  height: 60px;
}

.custom-navbar a {
  display: inline-block; 
  padding: 18px 0;
  margin-right: 1em; 
  font-weight: bold; 
}

.custom-navbar a:hover,
.custom-navbar a:focus {
  text-decoration: none; 
}

@media print {
  .custom-navbar {
    display: none;
  }
}

article {
  padding-bottom: 1em;
}

img {
  max-width: 100%;
}


body {
  background-color: #fff;
}



body {
  color: #212529;
}



a {
  color: #007bff;
}



a:hover,
a:focus {
  color: #0056b3;
}



.custom-navbar {
  background-color: #212529;
}



.custom-navbar a {
  color: rgba(255,255,255,.75);
}



.custom-navbar a:hover,
.custom-navbar a:focus {
  color: rgba(255,255,255,1);
}



.container {
  max-width: 800px;
}





</style>
</head>

<body>
  <nav class="custom-navbar">
  <div class="container">
    
    <a href="/">文章</a>
    
    <a href="/tags/">标签</a>
    
    <a href="/about/">关于</a>
    
    <a href="/index.xml">RSS</a>
    
  </div>
</nav>
  
  <div class="container">
    <article>
      <h1>Go modules</h1>
<h3 id="go-modules">go modules</h3>
<p>[TOC]</p>
<h2 id="go-113-的环境配置">go 1.13 的环境配置</h2>
<p>删除.zshrc 中的大部分配置，只配置goroot其余配置用下列命令：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>go env -w GOSUMDB<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;sum.golang.google.cn&#34;</span> <span style="color:#75715e"># 更换为国内的校验源，默认sum.golang.org</span>
</span></span><span style="display:flex;"><span>go env -w GOPROXY<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;https://goproxy.io,direct&#34;</span> <span style="color:#75715e"># 解决代理</span>
</span></span><span style="display:flex;"><span>go env -w GO111MODULE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;on&#34;</span>
</span></span><span style="display:flex;"><span>go env -w GOPRIVATE<span style="color:#f92672">=</span>*.gitlab.com,*.gitee.com <span style="color:#75715e"># 代理跳过私有库设置</span>
</span></span></code></pre></div><hr>
<h4 id="环境配置">环境配置</h4>
<ol>
<li>
<p>正确配置 GOROOT</p>
</li>
<li>
<p><code>export GOPROXY=&quot;https://goproxy.cn,direct&quot; # 七牛提供的公共代理，解决golang/x/tools 下载失败</code></p>
</li>
</ol>
<h4 id="初始化-同时-确定了项目的绝对目录路径">初始化 同时 确定了项目的绝对目录路径</h4>
<p>go mod init v5u.win/projectapi
生成 go.mod
导入包：<code>import &quot;v5u.win/projectapi/src/app/service&quot;</code></p>
<h4 id="添加依赖">添加依赖</h4>
<p>go mod tidy</p>
<h4 id="生成-gosum-自动添加依赖关系到-gomod">生成 go.sum 自动添加依赖关系到 go.mod</h4>
<p><code>go run main.go</code></p>
<h4 id="下载依赖包">下载依赖包</h4>
<p><code>go mod download github.com/pelletier/go-toml</code></p>
<h4 id="tips">Tips:</h4>
<ol>
<li>不能在 golib/src 下创建项目</li>
<li>在 Go1.11 版本下，GOPATH 目录中的项目默认是禁用 Go Module 的，需要手动开启</li>
<li>export GOPROXY=&ldquo;<a href="https://goproxy.cn">https://goproxy.cn</a>,direct&rdquo; // 微软提供的公共代理,也可以以此技术建立自己的公共库</li>
<li>export export GO111MODULE=on // 必须使用module依赖，在src/ 目录下可以使用module。 go1.13已经全面支持</li>
</ol>
<p>一条 <code>go env-w GOPROXY=https://goproxy.cn,direct</code>即可。之所以在后面拼接一个 <code>,direct</code>，是因为通过这样做我们可以在一定程度上解决私有库的问题（当然， goproxy.cn 无法访问你的私有库）</p>
<h4 id="常用命令">常用命令</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>go mod tidy //拉取缺少的模块，移除不用的模块。
</span></span><span style="display:flex;"><span>go mod download //下载依赖包
</span></span><span style="display:flex;"><span>go mod graph //打印模块依赖图
</span></span><span style="display:flex;"><span>go mod vendor //将依赖复制到 vendor 下
</span></span><span style="display:flex;"><span>go mod verify //校验依赖
</span></span><span style="display:flex;"><span>go mod why //解释为什么需要依赖
</span></span><span style="display:flex;"><span>go list -m -json all //依赖详情
</span></span></code></pre></div><h3 id="注">注：</h3>
<p>module vgo 默认使用本地缓存的代码版本，如果想指定版本的话，最好显示声明一下，不要使用自动解析的方式。</p>
<p>file go.mod</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#a6e22e">module</span> <span style="color:#a6e22e">giligili</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">go</span> <span style="color:#ae81ff">1.13</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">require</span> (
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">github</span>.<span style="color:#a6e22e">com</span><span style="color:#f92672">/</span><span style="color:#a6e22e">gin</span><span style="color:#f92672">-</span><span style="color:#a6e22e">gonic</span><span style="color:#f92672">/</span><span style="color:#a6e22e">gin</span> <span style="color:#a6e22e">v1</span><span style="color:#ae81ff">.4.0</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">github</span>.<span style="color:#a6e22e">com</span><span style="color:#f92672">/</span><span style="color:#66d9ef">go</span><span style="color:#f92672">-</span><span style="color:#a6e22e">redis</span><span style="color:#f92672">/</span><span style="color:#a6e22e">redis</span> <span style="color:#a6e22e">v6</span><span style="color:#ae81ff">.15.5</span><span style="color:#f92672">+</span><span style="color:#a6e22e">incompatible</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">github</span>.<span style="color:#a6e22e">com</span><span style="color:#f92672">/</span><span style="color:#a6e22e">jinzhu</span><span style="color:#f92672">/</span><span style="color:#a6e22e">gorm</span> <span style="color:#a6e22e">v1</span><span style="color:#ae81ff">.9.10</span>
</span></span><span style="display:flex;"><span>)
</span></span></code></pre></div><h3 id="引入本地依赖包">引入本地依赖包</h3>
<p>前面铺垫了这么多，接下来回到我们的主题，我该怎样使用我们自己开发的工具包呢？ 假设我们有一个新的项目 <code>testmod-demo</code>，现在想要在新的项目中使用 testmod 中的工具包，那么首先我们需要使用 <code>go mod</code> 初始化该项目：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>cd testmod-demo
</span></span><span style="display:flex;"><span>go mod init gitee.com/rockyang/testmod-demo
</span></span></code></pre></div><p>初始化之后会在当前项目根目录生成一个 <code>go.mod</code>，接下来我们有两种方式去引入 testmod 包，一种是直接修改 <code>go.mod</code> 文件，在 require 配置中添加上</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>gitee.com/rockyang/testmod v0.0.0-20190610103414-4c55783279db
</span></span></code></pre></div><p>或者使用 <code>go mod edit</code> 命令修改依赖</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>go mod edit -require<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;gitee.com/rockyang/testmod@v0.0.0-20190610103414-4c55783279db&#34;</span>
</span></span><span style="display:flex;"><span>go mod tidy <span style="color:#75715e"># 整理依赖包</span>
</span></span></code></pre></div><h3 id="使用-replace-将远程包替换为本地包服务">使用 replace 将远程包替换为本地包服务</h3>
<p>这时如果你执行 <code>go build</code> 的时候会报错，提示找不到 <code>gitee.com/rockyang/testmod</code>，是因为你没有把仓库推送到远程，所以无法下载。 go module 提供了另外一个方案, 使用 replace, 编辑 go.mod 文件，在最后面添加： <code>replace gitee.com/rockyang/testmod =&gt; /gopath/src/gitee.com/rockyang/testmod</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>module gitee.com/rockyang/testmod-demo
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>go 1.12
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>require <span style="color:#f92672">(</span>
</span></span><span style="display:flex;"><span>    github.com/gin-gonic/gin v1.3.0
</span></span><span style="display:flex;"><span>	gitee.com/rockyang/testmod@v0.0.0-20190610103414-4c55783279db
</span></span><span style="display:flex;"><span>    golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 // indirect
</span></span><span style="display:flex;"><span><span style="color:#f92672">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>replace gitee.com/rockyang/testmod <span style="color:#f92672">=</span>&gt; /gopath/src/gitee.com/rockyang/testmod
</span></span></code></pre></div><blockquote>
<p>这里的 /gopath/src/gitee.com/rockyang/testmod 是本地的包路径</p>
</blockquote>
<p>然后再执行 <code>go build</code> 你会看到你想要的结果。</p>
<h2 id="私有库相关设置">私有库相关设置</h2>
<p>首先私有服务器必须有一个域名，不能使用ip。</p>
<p>这里使用 gitee 和 GitHub 作为测试服务器</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>GOSUMDB<span style="color:#f92672">=</span>off <span style="color:#75715e">#解决私有库校验不过，放弃校验，大心脏者适用</span>
</span></span><span style="display:flex;"><span>GOSUMDB<span style="color:#f92672">=</span>sum.golang.google.cn <span style="color:#75715e">#或者 更换校验源</span>
</span></span><span style="display:flex;"><span>go env -w GOSUMDB<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;sum.golang.google.cn&#34;</span> <span style="color:#75715e"># google 为我们提供了国内的校验源</span>
</span></span></code></pre></div><p>配置 .gitconfig 将 http 改为 ssh 获取。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#f92672">[</span>http<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>	extraheader <span style="color:#f92672">=</span> PRIVATE-TOKEN: token
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>url <span style="color:#e6db74">&#34;git@gitee.com:fan.jinlong/go_module_lib.git&#34;</span><span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>	insteadOf <span style="color:#f92672">=</span> https://gitee.com/fan.jinlong/go_module_lib.git
</span></span></code></pre></div><p>坑4:拉取私有模块</p>
<p><img src="https://image.eddycjy.com/075bdc3d3552c000981c9d4fdd8d0f3f.jpg" alt="image"></p>
<p>这里主要想涉及两块知识点，如下：</p>
<p>- GOPROXY 是无权访问到任何人的私有模块的，所以你放心，安全性没问题。
- GOPROXY 除了设置模块代理的地址以外，还需要增加 “direct” 特殊标识才可以成功拉取私有库。</p>

    </article>
  </div>

  
  
  

  
</body>

</html>